package com.ruoyi.web.controller.tool.designpattern.behavioralPatterns.templatemethod;

/**
 * TODO
 *
 * @author Hack2003
 * @date 2024/3/20 16:11
 **/
// 抽象模板
abstract class AbstractTemplate {
    // 模板方法定义了算法的骨架
    public void templateMethod() {
        operation1();
        operation2();
    }

    // 抽象方法，由子类实现
    abstract void operation1();

    // 具体方法，子类可以选择重写
    void operation2() {
        System.out.println("抽像类中：操作2默认实现.");
    }
}

// 具体模板 A
class ConcreteTemplateA extends AbstractTemplate {
    @Override
    void operation1() {
        System.out.println("具体模板1:操作1实现。");
    }

    @Override
    void operation2() {
        System.out.println("具体模板1：操作2的实现。");
    }
}

// 具体模板 B
class ConcreteTemplateB extends AbstractTemplate {
    @Override
    void operation1() {
        System.out.println("具体模板2:操作1实现。");
    }
}

/**
 * 模板方法模式有助于提高代码的复用性和可维护性，
 * 减少重复代码，并使算法的结构更清晰。
 * 这种模式通常用于定义算法的整体结构，而将具体实现延迟到子类中。
 */
public class Test {
    public static void main(String[] args) {
        //模板方法。就是抽象类，定义了算法的骨架，子类实现具体的算法
        //这里，按子类都输出了
        AbstractTemplate templateA = new ConcreteTemplateA();
        templateA.templateMethod();

        //这里，子类有个方法没有实现，使用了父类的方法。如果实现了，那么输出的是子类的。
        AbstractTemplate templateB = new ConcreteTemplateB();
        templateB.templateMethod();
    }
}